#ifdef __unix__
#include <signal.h>
#include <unistd.h>
#include <sys/time.h>
#endif

#ifdef _WIN32
#include <windows.h>
#endif

#include "interrupt.h"

static uint32_t sysTick_time = 0;

#define SYS_TICK_PER_MS 10 // 系统时钟周期（毫秒）

// 定义中断处理函数
#ifdef __unix__
static void interrupt_handler(int signum) {
    sysTick_time += SYS_TICK_PER_MS;
}
#endif

#ifdef _WIN32
static void CALLBACK interrupt_handler(PVOID lpArgToCompletionRoutine, DWORD dwTimerLowValue, DWORD dwTimerHighValue) {
    sysTick_time += SYS_TICK_PER_MS;
}
#endif

uint32_t SYS_GetTick(void)
{
  return sysTick_time;
}

#ifdef _WIN32
HANDLE timerQueue;
HANDLE timerHandle;
#endif

// 初始化状态机
int interrupt_init(void){
#ifdef __unix__
    struct sigaction sa;
    struct itimerval timer;

    // 设置信号处理函数
    sa.sa_handler = interrupt_handler;
    sa.sa_flags = SA_RESTART;
    sigemptyset(&sa.sa_mask);

    if (sigaction(SIGALRM, &sa, NULL) == -1) {
        perror("sigaction");
        return -1;
    }

    // 配置定时器
    timer.it_value.tv_sec = 0; // 初始延迟时间（秒）
    timer.it_value.tv_usec = SYS_TICK_PER_MS * 1000; // 初始延迟时间（微秒），这里是1毫秒

    timer.it_interval.tv_sec = 0; // 定时器间隔时间（秒）
    timer.it_interval.tv_usec = SYS_TICK_PER_MS * 1000; // 定时器间隔时间（微秒），这里是1毫秒

    // 设置定时器
    if (setitimer(ITIMER_REAL, &timer, NULL) == -1) {
        perror("setitimer");
        return -1;
    }
#endif

#ifdef _WIN32
    timerQueue = CreateTimerQueue();
    if (timerQueue == NULL) {
        printf("CreateTimerQueue failed (%d)\n", GetLastError());
        return -1;
    }

    if (!CreateTimerQueueTimer(&timerHandle, timerQueue, (WAITORTIMERCALLBACK)interrupt_handler, NULL, SYS_TICK_PER_MS, SYS_TICK_PER_MS, 0)) {
        printf("CreateTimerQueueTimer failed (%d)\n", GetLastError());
        CloseHandle(timerQueue);
        return -1;
    }
#endif

    return 0;
}

void interrupt_deinit(void) {
#ifdef _WIN32
    if (!DeleteTimerQueueEx(timerQueue, NULL)) {
        printf("DeleteTimerQueueEx failed (%d)\n", GetLastError());
    }
#endif
}